# coding=utf-8
from demoScripts.bedcore.server import ServerSystem, levelId, serverApi
from demoScripts.server.config import ServerConfig
from demoScripts.server.data import config


class MainSystem(ServerSystem):
    # 注册配置用到的命名空间
    CONFIG_REGISTER_KEY = 'demo'

    def __init__(self, namespace, systemName):
        super(MainSystem, self).__init__(namespace, systemName)

    def addEventListen(self, namespace, systemName):
        self.ListenForEvent('Phosphorus', 'main', 'PhosphorusLoadedEvent', self, self.PhosphorusLoadedEvent)
        self.ListenForEvent('Phosphorus', 'main', 'ServerConfigChangedEvent', self, self.ServerConfigChangedEvent)
        self.ListenForEvent('Phosphorus', 'main', 'ServerButtonClickedEvent', self, self.ServerButtonClickedEvent)

    def Destroy(self):
        super(MainSystem, self).Destroy()
        # 保存配置
        config.persistence()

    def PhosphorusLoadedEvent(self, args):
        # 磷服务端加载完成事件
        # 在此事件触发后，才能安全地获取到Phosphorus服务端的config组件
        comp = serverApi.CreateComponent(levelId, 'Phosphorus', 'config')

        # 获取配置构建器，并实例化配置构建器
        builder = comp.GetConfigBuilder()()
        # 实例化ServerConfig类（不调用create方法即可实例化为默认值）
        default = ServerConfig()

        # 往配置构建器中添加选项
        # 默认情况下，选项不需要管理员权限就能修改，如果需要进行限制，请添加.operator()
        # 一般而言，修改服务端选项需要管理员权限
        builder.switch('switch', config.switch, default.switch).operator()
        builder.enum('enum', config.enum, default.enum, ('one', 'two', 'three', 'four')).operator()
        builder.int('int', config.int, default.int, 0, 255).operator()
        builder.float('float', config.float, default.float, 0.0, 1.0).operator()
        builder.color('color', config.color, default.color).operator()
        # 默认情况下，按钮不需要管理员权限就能点击，如果需要进行限制，请添加.operator()
        # 一般而言，点击服务端按钮需要管理员权限
        builder.button('button').operator()

        # 往配置构建器中添加一些带回调函数的选项
        builder.enum('enum2', config.enum2, default.enum2, (
            '0x000000',
            '0x0000ff',
            '0x00ff00',
            '0xff0000',
            '0x00ffff',
            '0xff00ff',
            '0xffff00',
            '0xffffff',
        )).operator().callback(self.enum2callback)
        builder.button('button2').operator().callback(self.button2callback)

        # 进行注册
        comp.RegisterConfig(self.CONFIG_REGISTER_KEY, builder.build())

    def ServerConfigChangedEvent(self, args):
        # 服务端选项改变事件
        # 玩家修改了服务端的选项后，会触发该事件（如果选项已注册回调函数，则调用回调函数而不触发此事件）
        # 先判断命名空间，不是该模组注册的命名空间时不执行后续代码
        if args['namespace'] != self.CONFIG_REGISTER_KEY:
            return
        print 'ServerConfigChangedEvent: {}'.format(args)
        # 将变化后的值保存到实例中
        setattr(config, args['key'], args['value'])

    def ServerButtonClickedEvent(self, args):
        # 服务端按钮点击事件
        # 玩家点击了服务端的按钮选项后，会触发该事件（如果选项已注册回调函数，则调用回调函数而不触发此事件）
        # 先判断命名空间，不是该模组注册的命名空间时不执行后续代码
        if args['namespace'] != self.CONFIG_REGISTER_KEY:
            return
        print 'ClientButtonClickedEvent: {}'.format(args)

    def enum2callback(self, args):
        # 这是一个回调函数，已将其绑定为enum2的回调函数，玩家修改enum2后会自动调用此函数
        # 回调函数需要接收一个字典类型的参数
        print 'enum2 callback: {}'.format(args)
        # 将变化后的值保存到实例中
        config.enum2 = args['value']

    def button2callback(self, args):
        # 这是一个回调函数，已将其绑定为button2的回调函数，玩家点击button2后会自动调用此函数
        # 回调函数需要接收一个字典类型的参数
        print 'button2 callback: {}'.format(args)
